#ifndef _OD_SIP_STATE_MACHINE_H_
#define _OD_SIP_STATE_MACHINE_H_

#ifdef __cplusplus
    extern "C" {
#endif 



typedef enum{
    PHONE_STATUS_AVAILABLE=0,                /**< 空闲*/
    PHONE_STATUS_DIAL,                       /**< 拨号中*/
    PHONE_STATUS_REMOTE_RINGING,             /**< 对端响铃中*/
    PHONE_STATUS_PROCEEDING,                 /**< 响应100trying*/
    PHONE_STATUS_MEDIA_AUD_ERR,              /**< 音频协商失败  */   
    PHONE_STATUS_REMOTE_BUSY,                /**< 占线*/
    PHONE_STATUS_MEDIA_ERR,                  /**< 协商失败, 媒体类型不支持*/
    PHONE_STATUS_LOCAL_ERR,                  /**< 本地错误*/
    PHONE_STATUS_CALL_REQUESTFAILURE,        /**< 呼叫失败*/
    PHONE_STATUS_NOT_FOUND,                  /**< 用户是空号*/
    PHONE_STATUS_REQUEST_TERMINATED,         /**< 无人应答*/
    PHONE_STATUS_TEMPORARILY_UNAVAILABLE,    /**< 对端暂时不可用*/
    PHONE_STATUS_DECLINE,                    /**< 对端拒绝应答*/
    PHONE_STATUS_UNREGISTERED,               /**< 设备未注册*/
    PHONE_STATUS_REGISTER_INVALID,           /**< 注册失效*/
    PHONE_STATUS_VID_RECODER_AT_WORK,        /**< 正在录像，主叫失败*/
    PHONE_STATUS_MEDIA_VID_ERR,              /**< 视频协商失败*/
    PHONE_STATUS_UNSUPPORT_MEDIA_TYPE,       /**< 不支持的媒体类型*/
    PHONE_STATUS_CONVERSATION,               /**< 通话中*/
    PHONE_STATUS_CANCEL,                     /**< 取消通话*/
    PHONE_STATUS_HANG,                       /**< 通话结束*/
    PHONE_STATUS_NEW_CALL_COMING,            /**< 新来电预处理*/
    PHONE_STATUS_LOCAL_RINGING,              /**< 本地响铃*/
    PHONE_STATUS_SEND_200OK,                 /**< 本地接听*/
    PHONE_STATUS_RELEASE,                    /**< 协议栈释放*/
}phone_status;


typedef enum
{
    OD_SIP_STATE_MACHINE_PHONE_STATUS = 0,
    OD_SIP_STATE_MACHINE_TIME_CNT,
    OD_SIP_STATE_MACHINE_NUM
}od_sip_state_machine_def;

typedef struct
{
    const char *task_name;
    int group_id;
}od_sip_state_machine_static_params;


typedef struct
{
    int phone_status;    /**< 话机当前状态*/
    char time_cnt[128];  /**< 通话计时字符串格式 hh:mm:ss, 如：1:02:14，表示通话时长1小时2分14秒*/
}od_sip_state_machine_dynamic_params;

typedef void *od_sip_state_machine_handle;


extern const od_sip_state_machine_dynamic_params glb_sip_state_machine_dynamic_params_default;


/**
* 任务创建函数
* @param [in] static_params: 模块静态参数
* @param [in] dynamic_params: 模块动态参数
* @return 返回模块句柄
* - NULL: 创建失败
* - 非空: 返回模块句柄
*/
od_sip_state_machine_handle od_sip_state_machine_create(od_sip_state_machine_static_params *static_params, 
                                                           od_sip_state_machine_dynamic_params  *dynamic_params); 

/**
* 获取状态机此时状态
* @param [in] h: 状态机线程句柄
* @param [out] phone_status: 状态值
*/
phone_status get_phone_status(void *h);


/**
* 设置状态机此时状态
* @param [in] h: 状态机线程句柄
* @param [in] phone_status: 状态值
*/
void set_phone_status(void *h, phone_status value);


#ifdef __cplusplus
    }
#endif

#endif

/*_*/

